package com.java.core1.chapter3;

import org.junit.Test;

/**
 * @author ClearScenery
 * @version 创建时间：2019年2月20日 下午3:19:18
 * @ClassName OperatorTest
 * @Description 运算符测试
 */
public class TestOperator {
	@Test
	public void testBaseOperator() {
//		System.out.println(1 / 0);
		// 注意，整数被 0 除将会产生一个异常，而浮点数被 0 除将会得到无穷大或 NaN 结果
		System.out.println(1.0 / 0);
	}

	@Test
	public void testOperator2() {
		/*
		 * Java 沿用了 C++的做法，使用 && 表示逻辑“与”运算符，使用丨|表示逻辑“或”运算
		 * 符。从!=运算符可以想到，感叹号！就是逻辑非运算符。&&和丨|运算符是按照“短路”方
		 * 式来求值的：如果第一个操作数已经能够确定表达式的值，第二个操作数就不必计算了。如 果用 && 运算符合并两个表达式
		 */
		int x = 0, y = 3;
		boolean c = (x != 0) && 1 / x > x + y; // no division by 0
		/*
		 * 如果 x 等于 0, 那么第二部分就不会计算。因此，如果 X 为0, 也就不会计算 1 / x , 除 以 0 的错误就不会出现。
		 */

		/*
		 * 类似地，如果第一个表达式为 true， ex1 || ex2 的值就自动为 true, 而无需 计算第二个表达式。
		 */

		// 三元运算符 ?:

		// 位运算符

		// 不存在<<<
		int n = 1;//00000001
		n = 1 >>> 1;
		System.out.println(n);//00000000  >>> 用0填充高位
		n = 1 >> 1;
		System.out.println(n);//00000000  >>  用符号位填充高位
		/*
		 * 注释：应用在布尔值上时，& 和丨运算符也会得到一个布尔值。这些运算符与 &&和丨丨运 算符很类似，不过 &
		 * 和丨运算符不采用“短路”方式来求值，也就是说，得到计算结果
		 */

		/*
		 * 警告：移位运算符的右操作数要完成模 32 的运算（除非左操作数是 long 类型，在这种情 况下需要对右操作數模 64)。例如，1«35 的值等同于
		 * 1«3 或 8。
		 */
		n = 1;
		String binaryString1 = Integer.toBinaryString(n);
		System.out.println(binaryString1);
		System.out.println(n);
		n = ~1;//11111111111111111111111111111110 补码
		/*
		 *   11111111111111111111111111111110    -1
		 * - 11111111111111111111111111111101	   取反
		 *   10000000000000000000000000000010 	 -2
		 */
		String binaryString2 = Integer.toBinaryString(n);
		System.out.println(binaryString2);
		System.out.println(n);
		
//		n = 1;
		n = 1 << 35;//1000
		System.out.println(n);
		n = 1 << 3;//1000    00000001  << 3    00001111  35%32 = 3
		System.out.println(n);
		n = 1 << 8;//100000000
		System.out.println(Integer.toBinaryString(n));
		
		//括号与运算符优先级
		//a && b || c   == (a M b) || c
	}
}
